home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / comm / tcp / Amster.lha / Amster_Install / Source / msg.c < prev    next >
C/C++ Source or Header  |  2000-07-31  |  7KB  |  269 lines

  1. /*
  2. ** Amster - Messenger
  3. ** by Jacob Laursen <laursen@myself.com>
  4. */
  5.  
  6. #include "include/config.h"
  7.  
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11.  
  12. #include "include/mui.h"
  13.  
  14. #include <proto/dos.h>
  15. #include <proto/utility.h>
  16. #include <MUI/NListview_mcc.h>
  17.  
  18. #include "include/gui.h"
  19. #include "include/napster.h"
  20. #include "include/msg.h"
  21. #include "amster_Cat.h"
  22. #include "include/protos.h"
  23.  
  24. ULONG msg_new(struct IClass *cl, Object *obj, struct opSet *msg);
  25. MUIF MessageDisplay(REG(a2) char **array, REG(a1) struct ChatMessage *m);
  26. void msg_say(struct msgdata *data);
  27. void msg_whois(struct msgdata *data, char *info);
  28. void msg_whowas(struct msgdata *data, char *user, char *level, u_long lastseen);
  29. void InsertMsgEntry(struct msgdata *data, char *Desc, char *Msg);
  30.  
  31.  
  32. MUIF msg_dispatch(REG(a0) struct IClass *cl,REG(a2) Object *obj,REG(a1) Msg msg)
  33. {
  34.     switch(msg->MethodID) {
  35.         case OM_NEW:
  36.             return(msg_new(cl, obj, (APTR)msg));
  37.         case MSG_OPEN:
  38.             set(obj, MUIA_Window_Open, TRUE);
  39.             return(NULL);
  40.         case MSG_GOT:
  41.             {
  42.             struct msgdata *data = INST_DATA(cl, obj);
  43.             long winopen;
  44.  
  45.             get(obj, MUIA_Window_Open, &winopen);
  46.             if (!winopen) set(obj, MUIA_Window_Open, TRUE);
  47.             /* Open the window if it's not already opened, when receiving a message */
  48.  
  49.             msg_got(data, (char *)((muimsg)msg)->arg1, (char *)((muimsg)msg)->arg2);
  50.             return(NULL);
  51.             }
  52.         case MSG_SAY:
  53.             {
  54.             struct msgdata *data = INST_DATA(cl,obj);
  55.             msg_say(data);
  56.             return(NULL);
  57.             }
  58.         case MSG_WHOIS:
  59.             {
  60.             struct msgdata *data = INST_DATA(cl,obj);
  61.             msg_whois(data, (char *)(((muimsg)msg)->arg1));
  62.             return(NULL);
  63.             }
  64.         case MSG_WHOWAS:
  65.             {
  66.             struct msgdata *data = INST_DATA(cl,obj);
  67.             msg_whowas(data, (char *)(((muimsg)msg)->arg1), (char *)(((muimsg)msg)->arg2), (u_long)(((muimsg)msg)->arg3));
  68.             return(NULL);
  69.             }
  70.  
  71.     }
  72.     return(DoSuperMethodA(cl, obj, msg));
  73. }
  74.  
  75.  
  76. ULONG msg_new(struct IClass *cl, Object *obj, struct opSet *msg)
  77. {
  78.     static struct Hook MessageDispHook = { {NULL, NULL}, &MessageDisplay, NULL, NULL };
  79.  
  80.     struct msgdata *data;
  81.     Object *msglist, *msgstr;
  82.  
  83.     if (obj = (Object *)DoSuperNew(cl, obj,
  84.         MUIA_HelpNode, "messenger",
  85.         WindowContents, VGroup,
  86.             Child, NListviewObject,
  87.                 MUIA_NListview_NList, msglist = NListObject,
  88.                     ReadListFrame,
  89.                     MUIA_NList_Input, FALSE,
  90.                     MUIA_NList_DefaultObjectOnClick, FALSE,
  91.                     MUIA_NList_DisplayHook, &MessageDispHook,
  92.                     MUIA_NList_Format, "BAR,BAR,",
  93.                     MUIA_NList_AutoCopyToClip, TRUE,
  94.                     MUIA_NList_TypeSelect, MUIV_NList_TypeSelect_Char,
  95.                     MUIA_NList_AutoVisible, TRUE,
  96.                 End,
  97.             End,
  98.             Child, msgstr = StringObject,
  99.                 StringFrame,
  100.                 MUIA_CycleChain, 1,
  101.                 MUIA_String_MaxLen, 256,
  102.             End,
  103.         End,
  104.         TAG_MORE, msg->ops_AttrList))
  105.     {
  106.         data = INST_DATA(cl, obj);
  107.         data->msglist = msglist;
  108.         data->msgstr = msgstr;
  109.  
  110.         set(obj, MUIA_Window_ID, MAKE_ID('M','E','S','G'));
  111.         set(obj, MUIA_Window_Title, MSG_USER_TITLE),
  112.  
  113.         DoMethod(msgstr, MUIM_Notify, MUIA_String_Acknowledge, MUIV_EveryTime, obj,    1, MSG_SAY);
  114.         DoMethod(msgstr, MUIM_Notify, MUIA_String_Acknowledge, MUIV_EveryTime, obj,    3, MUIM_Set, MUIA_Window_ActiveObject, msgstr);
  115.         DoMethod(msgstr, MUIM_Notify, MUIA_String_Acknowledge, MUIV_EveryTime, msgstr, 3, MUIM_Set, MUIA_String_Contents,     NULL);
  116.  
  117.         DoMethod(obj, MUIM_Notify, MUIA_Window_Activate,     TRUE, obj, 3, MUIM_Set, MUIA_Window_ActiveObject, msgstr);
  118.         DoMethod(obj, MUIM_Notify, MUIA_Window_CloseRequest, TRUE, obj, 3, MUIM_Set, MUIA_Window_Open,         FALSE);
  119.  
  120.         return((ULONG)obj);
  121.     }
  122.     return(0);
  123. }
  124.  
  125.  
  126. MUIF MessageDisplay(REG(a2) char **array, REG(a1) struct ChatMessage *m)
  127. {
  128.     *array++ = m->TStamp;
  129.     *array++ = m->Nick;
  130.     *array = m->Msg;
  131.  
  132.     return 0;
  133. }
  134.  
  135.  
  136. void msg_say(struct msgdata *data)
  137. {
  138.     u_long tmp;
  139.     char *cmd, *args;
  140.     struct ChatMessage *m;
  141.     char buf[32];
  142.  
  143.     m = malloc(sizeof(struct ChatMessage));
  144.     if (!m) return;
  145.  
  146.     if (gui_onlinestate < ONLINE) {
  147.         InsertMsgEntry(data, (char *)MSG_MESSAGE_INFO, (char *)MSG_USER_NOTCONN);
  148.         return;
  149.     }
  150.     GetAttr(MUIA_String_Contents, data->msgstr, &tmp);
  151.     cmd = strtok((char *)tmp," ");
  152.     args = strtok(NULL,"");
  153.     if (!cmd || !args) return;
  154.  
  155.     if (stricmp(cmd, "/whois") == 0) {
  156.         nap_sendbuf(NAPC_WHOIS, args);
  157.     }
  158.     else {
  159.         sprintf(nap_buf, "%s %s", cmd, args);
  160.         nap_send(NAPC_PRIVATEMSG);
  161.  
  162.         sprintf(buf, ">%s<", cmd);
  163.         InsertMsgEntry(data, buf, args);
  164.     }
  165. }
  166.  
  167.  
  168. void msg_whois(struct msgdata *data, char *info)
  169. {
  170.     char buf[1024];
  171.     char *nick, *level, *channels, *status, *client;
  172.     int time, shared, downloads, uploads, link;
  173.  
  174.     nick =      nap_token(&info);
  175.     level =     nap_token(&info);
  176.     time =      nap_ltoken(&info);
  177.     channels =  nap_token(&info);
  178.     status =    nap_token(&info);
  179.     shared =    nap_itoken(&info);
  180.     downloads = nap_itoken(&info);
  181.     uploads =   nap_itoken(&info);
  182.     link =      nap_itoken(&info);
  183.     client =    nap_token(&info);
  184.  
  185.     sprintf(buf, (char *)MSG_MESSAGE_WHOIS1, nick, level, time/360, (time/60)%60, time%60, status);
  186.     InsertMsgEntry(data, (char *)MSG_MESSAGE_WHOIS_DESC, buf);
  187.  
  188.     if (channels != NULL) {
  189.         sprintf(buf, (char *)MSG_MESSAGE_WHOIS2, channels);
  190.         InsertMsgEntry(data, (char *)MSG_MESSAGE_WHOIS_DESC, buf);
  191.     }
  192.  
  193.     sprintf(buf, (char *)MSG_MESSAGE_WHOIS3,
  194.         shared, downloads, uploads);
  195.     InsertMsgEntry(data, (char *)MSG_MESSAGE_WHOIS_DESC, buf);
  196.  
  197.     sprintf(buf, (char *)MSG_MESSAGE_WHOIS4, client, nap_linktype[link]);
  198.     InsertMsgEntry(data, (char *)MSG_MESSAGE_WHOIS_DESC, buf);
  199.  
  200.     set(data->msglist, MUIA_NList_First, MUIV_NList_Active_Bottom);
  201. }
  202.  
  203.  
  204. void msg_whowas(struct msgdata *data, char *user, char *level, u_long lastseen)
  205. {
  206.     struct ClockData *cd;
  207.     char buf[1024];
  208.     struct ChatMessage *m;
  209.  
  210.     m = malloc(sizeof(struct ChatMessage));
  211.     if (!m) return;
  212.  
  213.     lastseen -= (8*365+2)*24*60*60;
  214.     /* Number of seconds between January 1st/0:00, 1970 and January 1st/0:00, 1978 */
  215.  
  216.     if (cd = malloc(sizeof(struct ClockData))) {
  217.         Amiga2Date(lastseen, cd);
  218.         sprintf(buf, (char *)MSG_MESSAGE_WHOWAS, user, level, cd->month, cd->mday, cd->year, cd->hour, cd->min, cd->sec);
  219.         free(cd);
  220.         InsertMsgEntry(data, (char *)MSG_MESSAGE_WHOWAS_DESC, buf);
  221.     }
  222. }
  223.  
  224.  
  225. void msg_got(struct msgdata *data, char *nick, char *msg)
  226. {
  227.     char buf[32];
  228.  
  229.     sprintf(buf, "<%s>", nick);
  230.     InsertMsgEntry(data, buf, msg);
  231. }
  232.  
  233.  
  234. void msg_gotwhois(char *buf)
  235. {
  236.     DoMethod(gui->mwin, MSG_WHOIS, buf);
  237. }
  238.  
  239.  
  240. void InsertMsgEntry(struct msgdata *data, char *Desc, char *Msg)
  241. {
  242.     struct ClockData *cd;
  243.     struct DateStamp *ds, *rds;
  244.     u_long seconds = 0;
  245.     struct ChatMessage *m;
  246.  
  247.     m = malloc(sizeof(struct ChatMessage));
  248.     if (!m) return;
  249.  
  250.     if (ds = malloc(sizeof(struct DateStamp))) {
  251.         memset(ds, 0, sizeof(struct DateStamp));
  252.         if (rds = DateStamp(ds)) {
  253.             seconds = rds->ds_Days*24*60*60 + rds->ds_Minute*60 + rds->ds_Tick/50;
  254.         }
  255.         if (cd = malloc(sizeof(struct ClockData))) {
  256.             Amiga2Date(seconds, cd);
  257.             sprintf(m->TStamp, "%02d:%02d:%02d", cd->hour, cd->min, cd->sec);
  258.             free(cd);
  259.         }
  260.         free(ds);
  261.     }
  262.     if (m->TStamp[0] == '\0') strcpy(m->TStamp, "[??:??:??]");
  263.  
  264.     m->Nick = strdup(Desc);
  265.     m->Msg = strdup(Msg);
  266.     DoMethod(data->msglist, MUIM_NList_InsertSingleWrap, m, MUIV_NList_Insert_Bottom, WRAPCOL2, ALIGN_LEFT);
  267.     set(data->msglist, MUIA_NList_First, MUIV_NList_Active_Bottom);
  268. }
  269.